iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Software Development

PHP 語法通關系列 第 23

Day23 類別與物件--繼承、常見關鍵字

  • 分享至 

  • xImage
  •  

物件導向的繼承(inheritance)特性

繼承 為物件導向程式設計的特性之一,子類別 (subclass) 可以承接父類別 (superclass) 的 public 或 protected 成員 ,這兩者間就具有共通的 public 或 protected 成員。

  • 繼承的格式:
  clas 類名 extends 父類名{
      - 書寫子類獨有的方法和書寫
  }
  • 概念:
    父類: 被其它類繼承的就是父類,也叫作基類
    子類: 繼承其他類的類就是子類
  • 特點:
    1. 子類繼承父類既具備父類中所有的成員屬性和方法(私有的除外)
    2. 子類繼承父類之後可以具有子類獨有的屬性和方法
    3. 在繼承時,子類中允許出現和父類同名的方法,這種情況不會衝突,而是子類的方法會覆蓋父類的方法,這種方式叫做重載(從新加載)
    4. 魔術方法也可以被子類繼承
    5. 如果父類具有構造方法,子類也需要構造方法進行構造成員屬性,此時需要在子類中重載父類的構造方法,並且在構造方法中使用parent::__construct()進行調用父類的構造方法,構造繼承而來的父類的成員屬性
      PS. 繼承代碼的時候不要瞎繼承,要有一定的邏輯關係,人類不要繼承鳥類,不會變成鳥人
  • php繼承的特點和其他語言略有不同
    • php是單繼承的語言
    • 其他語言可能是多繼承
      PS. 可以研究一下trait可以實現多繼承
<?php
//如果類前加上final關鍵字 則 該類不能被繼承。此代碼運行會報錯,
//報錯有兩點:1. Animal類被Bear 類繼承。 2. Bear類中重載Animal類的方法。這兩個都被final修飾,所以不能重載也不能繼承。
final class Animal
{
    //成員屬性
    public $name = 'Animal in the World';
    public $sex;
    //成員方法
    final function life()
    {
        echo 'We are family~';
    }
    function sing()
    {
        echo 'Voice of Everything';
    }
}

//騾子類
class Bear extends Animal
{
    //成員屬性

    //成員方法
    function life() //失敗:Method 'Bear::life()' cannot override final method 'Animal::life()'
    {
        echo '熊熊熊熊';
    }
}

//實例化對象
$one = new Bear;
var_dump($one);
$one->sing();
$one->life();

屬性和方法的可視性(The Visibility of Properties and Methods)

訪問類型控制,定義類的屬性public(public是修飾符,共有三個,是public,protected,private)
如果沒有加上關鍵字,則PHP預設就當他是public的,屬性則必須要加上修飾符不然會報錯(如果用var關鍵字宣告的屬性則預設會當做public)。

  • 三個封裝關鍵字
    • private 私有化封裝
    • public 公共的封裝
    • protected 受保護的封裝
    • 子類同名的方法的封裝登記必須大於或者等於父類的封裝等級
    • private = 1
    • protected = 2
    • public = 3
    • var是封裝關鍵字,但是它不是一個標準的封裝關鍵字,var只能修飾成員屬性了,不能修飾成員方法,一般僅用於測試和學習。
    • var = 50%public

常見的關鍵字

  • final 關鍵字:之前例子有
    • 作用:
      1. 用來修飾成員方法,禁止在子類中重載父類的方法。
      2. 用來修飾類,被final修飾的類無法被繼承。
  • const 關鍵字
    • 使用CONST關鍵字在類中聲明常量,這種常量是類中的常量。 、
    • 聲明常量時需要給常量賦值
    • 聲明常量歸類所有而不是歸物件所有
    • 類中常量的訪問方式
      • 類外部
        • 類名::常量名
      • 類內部
        • 類名::常量名
        • self::常量名
    • 需要記住的是:
      • self 表示當前類
      • $this 當前的物件
  • static 關鍵字
    • 在類中使用static聲明的成員都是靜態成員

    • 靜態成員的特徵是:不歸物件所有,而是歸類所有
      1. static關鍵字,可以修飾成員屬性、成員方法
      2. static聲明的成員都是歸類所有,而不是歸物件所有,在沒有物件的情況下,可以通過類來訪問
      3. 能聲明靜態的成員就聲明靜態的成員(效率高)
      4. 具有動態成員的方法不可以聲明靜態成員方法。

    • 靜態成員訪問
      類的內部
      類名::$靜態成員屬性名
      self::$靜態成員屬性名
      類名::靜態成員方法名();
      self::靜態成員方法名();

      類的外部
      類名::$靜態成員屬性名
      類名:靜態成員方法名()

      物件->靜態成員方法名()(一般不用)
      
  1. 魔術方法 __toString()

    • 觸發時機:對一個物件進行echo操作時自動觸發
    • 功能:簡化操作或者為物件輸出值
    • 參數:無
    • 返回值: 必須有,並且必須為字符串類型
  2. 魔術方法 __call()

    • 觸發時機:調用類中不存在的方法時自動觸發
    • 功能:1.屏蔽錯誤 2為不存在的方法定義一個功能
    • 參數:2個; 1個是不存在的方法名,一個是所有的參數列表
    • 返回值: 可有可無

上一篇
Day22 類別與物件--魔術方法2 及 封裝private
下一篇
Day24 類別與物件--魔術方法3、trait
系列文
PHP 語法通關30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言